UILabel にインデントを設定する方法
UILabel の Indent
簡単そうでちょっと面倒な UILabel の字下げ。 今回は以下の 2 パターンの実現方法をご紹介します。
- UILabel のdrawTextInRectをオーバーライドする方法
- NSMutableParagraphStyleを利用する方法
オリジナルの見た目
Indent 設定後の見た目
1. UILabel の drawTextInRect をオーバーライドする方法
この方法では UILabel のサブクラスを作り、そのdrawTextInRectメソッドをオーバーライドします。
サンプルコード
class IndentLabel: UILabel { override func drawTextInRect(rect: CGRect) { let insets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets)) } }
テキストを描画する矩形のInsetsを指定することによってインデントを行っています。
サブクラス化するのがちょっと手間ですが、割とラク。
2. NSMutableParagraphStyle を利用する方法
こちらでは明示的にインデントする距離を指定します。
サンプルコード
let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.firstLineHeadIndent = 20 paragraphStyle.headIndent = 20 paragraphStyle.tailIndent = -20 let attributedString = NSAttributedString(string: text /* long text */, attributes: [NSParagraphStyleAttributeName: paragraphStyle]) self.label.attributedText = attributedString
NSMutableParagraphStyle を元に NSAttributedString を生成し、UILabel の attributedText として設定します。
headIndentとfirstLineHeadIndentを共に設定しなければいけないのが面倒なところ。 また、lineBreakModeもデフォルトで ByWordWrapping となっており、UILabel のデフォルトである ByTruncatingTail ではないというのも気になる。 ただ、Indent だけではなく、lineSpacingやparagraphSpacingといったプロパティが設定できるのは魅力的。
まとめ
個人的な感想としては、単純な Indent のみの設定を行いたいのであれば前者を、その他の複雑な設定も同時に行いたいのであれば後者を使うのがよいと感じました。